package motor;

import java.awt.Graphics;
import java.util.ArrayList;

import perso.MotorPersoImp;



import utils.Vector2d;

public class Motor
{
	ArrayList<MotorPerso> mp = new ArrayList<MotorPerso>();
	ArrayList<Integer> points = new ArrayList<Integer>();
	
	public Surface s;
	private float	sizeColliOfficiel = 2;
	private ArrayList<Unite> populationOfficielle = new ArrayList<Unite>();
	
	private int timer = 0;
	
	int pointsDeparts = 1000;

	public Motor(Surface surface)
	{
		s = surface;
		
		MotorPerso m0 = new MotorPersoRessourcee( this , 0 );
		
		MotorPerso m1 = new MotorPersoImp( this , 1 );
		MotorPerso m2 = new MotorPersoImp( this , 2 );
		
		m1.ajouterBatiment( 1 , 400 , 400 );

		mp.add( m0 );
		mp.add( m1 );
		mp.add( m2 );

		points.add(0);
		points.add(pointsDeparts);
		points.add(pointsDeparts);
	}
	
	public boolean achat( Unite origine , int camp , int type )
	{
		Unite u;

		if( type == 0 && points.get( camp ) > Unite.PRIX_0 )
		{
			int x;
			
			if( origine.getPos().x < s.wxsize/2)
				x = (int) (origine.getPos().x + origine.getSize()/2 + 5);//(int) (100 + Math.random() * 10);
			else
				x = (int) (origine.getPos().x - origine.getSize()/2 - 5);//(int) (100 + Math.random() * 10);
			
			int y = (int) origine.getPos().y;
			
			points.set(camp, points.get( camp ) - Unite.PRIX_0 );
			u = new UniteCivil(x, y , camp );
			
			populationOfficielle.add(u);
			mp.get(camp).ajouterUnite( u , type, x, y);
			System.out.println("Il reste " + points.get( camp ) );
			return true;
		}
		else if( type == 1 && points.get( camp ) > Unite.PRIX_1 )
		{
			int x;
			
			if( origine.getPos().x < s.wxsize/2)
				x = (int) (origine.getPos().x + origine.getSize()/2 + 5);//(int) (100 + Math.random() * 10);
			else
				x = (int) (origine.getPos().x - origine.getSize()/2 - 5);//(int) (100 + Math.random() * 10);
			
			int y = (int) origine.getPos().y;
			
			points.set(camp, points.get( camp ) - Unite.PRIX_0 );
			u = new UniteRecolteur(x, y , camp );
			
			populationOfficielle.add(u);
			mp.get(camp).ajouterUnite( u , type, x, y);
			System.out.println("Il reste " + points.get( camp ) );
			return true;
		}
		
		return false;
	}

	public void draw(Graphics buffer_canvas)
	{
		for( int i = 0 ; i < mp.size() ; i++)
		{
			mp.get(i).draw(buffer_canvas);
		}
		
		for( int i = 0 ; i < populationOfficielle.size() ; i++ )
		{
			populationOfficielle.get(i).draw( buffer_canvas );
		}
	}

	public void goOn()
	{
		
		ArrayList<Unite> populationMort = new ArrayList<Unite>();
		
		for( int i = 0 ; i < populationOfficielle.size() ; i++ )
		{
			visionEnemi( populationOfficielle.get(i) );
		}
		
		for( int i = 0 ; i < mp.size() ; i++ )
			mp.get(i).goOn();
		
		for( int i = 0 ; i < populationOfficielle.size() ; i++ )
		{
			if( !populationOfficielle.get(i).isRessource() )
				populationOfficielle.get(i).goOn( this );
		}
		
		for( int i = 0 ; i < populationOfficielle.size() ; i++ )
		{
			if( populationOfficielle.get(i).isDead() )
				populationMort.add( populationOfficielle.get(i) );
		}
		
		populationOfficielle.removeAll(populationMort);
		
		for( int i = 0 ; i < mp.size() ; i++ )
			mp.get(i).retirerMort( populationMort );
		
		timer++;
	}

	public void ajoutUnite(Unite u)
	{
		populationOfficielle.add(u);
	}
	

	public void visionEnemi(Unite u )
	{
		ArrayList<Unite> a = new ArrayList<Unite>();
		ArrayList<Unite> ar = new ArrayList<Unite>();
		
		for( int i = 0 ; i < populationOfficielle.size() ; i++ )
		{
			float dis = u.distance( populationOfficielle.get(i).getPos() );
			
			if( dis < u.getVision() && s.cansee( populationOfficielle.get(i).getPos() , u.getPos() ) == null )
			{
				if( populationOfficielle.get(i).getCamp() != u.getCamp() && populationOfficielle.get(i).getCamp() != 0 )
				{
					a.add(populationOfficielle.get(i));
				}
				else if( populationOfficielle.get(i).getCamp() == 0 )
				{
					ar.add(populationOfficielle.get(i));
				}
			}
		}
		
		u.setEnnemis( a );
		u.setRessources( ar );
		
		//System.out.println( u.getRessources() );
	}
	
	public boolean collision(Unite mere)
	{
		//System.out.println("\nCollision " + mere );
		
		for( int i = 0 ; i < populationOfficielle.size() ; i++ )
		{
			if( mere != populationOfficielle.get(i) )
			{
				float dis = mere.distance( populationOfficielle.get(i).getPos() );
				
				//System.out.println("Avec " + populationOfficielle.get(i) );
				
				//System.out.println( dis + " lim " + (populationOfficielle.get(i).getSize()/2 + mere.getSize()/2 + sizeColliOfficiel) );
	
				if( dis < populationOfficielle.get(i).getSize()/2 + mere.getSize()/2 + sizeColliOfficiel )
				{
					//System.out.println("stop");
					//return false;
				}
			}
		}

		return true;
	}

	public void setTimer(int timer)
	{
		this.timer = timer;
	}

	public int getTimer()
	{
		return timer;
	}

	public void germerRessource(int x, int y)
	{
		populationOfficielle.add( new UniteRessource(x, y, 0));
	}
}
